home *** CD-ROM | disk | FTP | other *** search
/ Programmer Power Tools / Programmer Power Tools.iso / turbopas / crcasm.arc / CRC32.ASM < prev    next >
Assembly Source File  |  1989-10-30  |  8KB  |  193 lines

  1. IDEAL
  2. ; This CRC-32 routine and tables were converted from code discovered
  3. ; in the DEZIP.PAS V2.0 by R. P. Byrne.  The comments there are:
  4. ;
  5. ; Converted to Turbo Pascal (tm) V4.0 March, 1988 by J.R.Louvau
  6. ; COPYRIGHT (C) 1986 Gary S. Brown.  You may use this program, or
  7. ; code or tables extracted from it, as desired without restriction.
  8. ;
  9. ; First, the polynomial itself and its table of feedback terms.  The
  10. ; polynomial is
  11. ; X^32+X^26+X^23+X^22+X^16+X^12+X^11+X^10+X^8+X^7+X^5+X^4+X^2+X^1+X^0
  12. ;
  13. ; Note that we take it "backwards" and put the highest-order term in
  14. ; the lowest-order bit.  The X^32 term is "implied"; the LSB is the
  15. ; X^31 term, etc.  The X^0 term (usually shown as "+1") results in
  16. ; the MSB being 1.
  17. ;
  18. ; Note that the usual hardware shift register implementation, which
  19. ; is what we're using (we're merely optimizing it by doing eight-bit
  20. ; chunks at a time) shifts bits into the lowest-order term.  In our
  21. ; implementation, that means shifting towards the right.  Why do we
  22. ; do it this way?  Because the calculated CRC must be transmitted in
  23. ; order from highest-order term to lowest-order term.  UARTs transmit
  24. ; characters in order from LSB to MSB.  By storing the CRC this way,
  25. ; we hand it to the UART in the order low-byte to high-byte; the UART
  26. ; sends each low-bit to high-bit; and the result is transmission bit
  27. ; by bit from highest- to lowest-order term without requiring any bit
  28. ; shuffling on our part.  Reception works similarly.
  29. ;
  30. ; The feedback terms table consists of 256, 32-bit entries.  Notes:
  31. ;
  32. ;     The table can be generated at runtime if desired; code to do so
  33. ;     is shown later.  It might not be obvious, but the feedback
  34. ;     terms simply represent the results of eight shift/xor opera-
  35. ;     tions for all combinations of data and CRC register values.
  36. ;
  37. ;     The values must be right-shifted by eight bits by the "updcrc"
  38. ;     logic; the shift must be unsigned (bring in zeroes).  On some
  39. ;     hardware you could probably optimize the shift in assembler by
  40. ;     using byte-swap instructions.
  41. ;     polynomial $edb88320
  42. ;
  43. ; <End of Pascal version comments>
  44. ;
  45. ; The Pascal logic is:
  46. ;
  47. ; Function UpdC32(Octet: Byte; Crc: LongInt) : LongInt;
  48. ; Begin
  49. ;
  50. ;   UpdC32 := CRC_32_TAB[Byte(Crc XOR LongInt(Octet))] XOR ((Crc SHR 8)
  51. ;             AND $00FFFFFF);
  52. ;
  53. ; End {UpdC32};
  54. ;
  55. ; This routine computes the 32 bit CRC used by PKZIP and its derivatives,
  56. ; and by Chuck Forsberg's "ZMODEM" protocol.  The block CRC computation
  57. ; should start with high-values (0ffffffffh), and finish by inverting all
  58. ; bits.
  59. ;
  60. ; This TASM conversion done by:
  61. ;
  62. ;   Edwin T. Floyd [76067,747]
  63. ;   #9 Adams Park Ct.
  64. ;   Columbus, GA 31909
  65. ;   404-576-3305 (work)
  66. ;   404-322-0076 (home)
  67. ;
  68. ; Borland's Turbo Assembler - TASM is required to assemble this program.
  69. ;
  70. SEGMENT  code BYTE PUBLIC
  71.          ASSUME cs:code
  72.  
  73. ;            0
  74. crc32tab dd     000000000h, 077073096h, 0ee0e612ch, 0990951bah
  75.          dd     0076dc419h, 0706af48fh, 0e963a535h, 09e6495a3h
  76.          dd     00edb8832h, 079dcb8a4h, 0e0d5e91eh, 097d2d988h
  77.          dd     009b64c2bh, 07eb17cbdh, 0e7b82d07h, 090bf1d91h
  78. ;            1
  79.          dd     01db71064h, 06ab020f2h, 0f3b97148h, 084be41deh
  80.          dd     01adad47dh, 06ddde4ebh, 0f4d4b551h, 083d385c7h
  81.          dd     0136c9856h, 0646ba8c0h, 0fd62f97ah, 08a65c9ech
  82.          dd     014015c4fh, 063066cd9h, 0fa0f3d63h, 08d080df5h
  83. ;            2
  84.          dd     03b6e20c8h, 04c69105eh, 0d56041e4h, 0a2677172h
  85.          dd     03c03e4d1h, 04b04d447h, 0d20d85fdh, 0a50ab56bh
  86.          dd     035b5a8fah, 042b2986ch, 0dbbbc9d6h, 0acbcf940h
  87.          dd     032d86ce3h, 045df5c75h, 0dcd60dcfh, 0abd13d59h
  88. ;            3
  89.          dd     026d930ach, 051de003ah, 0c8d75180h, 0bfd06116h
  90.          dd     021b4f4b5h, 056b3c423h, 0cfba9599h, 0b8bda50fh
  91.          dd     02802b89eh, 05f058808h, 0c60cd9b2h, 0b10be924h
  92.          dd     02f6f7c87h, 058684c11h, 0c1611dabh, 0b6662d3dh
  93. ;            4
  94.          dd     076dc4190h, 001db7106h, 098d220bch, 0efd5102ah
  95.          dd     071b18589h, 006b6b51fh, 09fbfe4a5h, 0e8b8d433h
  96.          dd     07807c9a2h, 00f00f934h, 09609a88eh, 0e10e9818h
  97.          dd     07f6a0dbbh, 0086d3d2dh, 091646c97h, 0e6635c01h
  98. ;            5
  99.          dd     06b6b51f4h, 01c6c6162h, 0856530d8h, 0f262004eh
  100.          dd     06c0695edh, 01b01a57bh, 08208f4c1h, 0f50fc457h
  101.          dd     065b0d9c6h, 012b7e950h, 08bbeb8eah, 0fcb9887ch
  102.          dd     062dd1ddfh, 015da2d49h, 08cd37cf3h, 0fbd44c65h
  103. ;            6
  104.          dd     04db26158h, 03ab551ceh, 0a3bc0074h, 0d4bb30e2h
  105.          dd     04adfa541h, 03dd895d7h, 0a4d1c46dh, 0d3d6f4fbh
  106.          dd     04369e96ah, 0346ed9fch, 0ad678846h, 0da60b8d0h
  107.          dd     044042d73h, 033031de5h, 0aa0a4c5fh, 0dd0d7cc9h
  108. ;            7
  109.          dd     05005713ch, 0270241aah, 0be0b1010h, 0c90c2086h
  110.          dd     05768b525h, 0206f85b3h, 0b966d409h, 0ce61e49fh
  111.          dd     05edef90eh, 029d9c998h, 0b0d09822h, 0c7d7a8b4h
  112.          dd     059b33d17h, 02eb40d81h, 0b7bd5c3bh, 0c0ba6cadh
  113. ;            8
  114.          dd     0edb88320h, 09abfb3b6h, 003b6e20ch, 074b1d29ah
  115.          dd     0ead54739h, 09dd277afh, 004db2615h, 073dc1683h
  116.          dd     0e3630b12h, 094643b84h, 00d6d6a3eh, 07a6a5aa8h
  117.          dd     0e40ecf0bh, 09309ff9dh, 00a00ae27h, 07d079eb1h
  118. ;            9
  119.          dd     0f00f9344h, 08708a3d2h, 01e01f268h, 06906c2feh
  120.          dd     0f762575dh, 0806567cbh, 0196c3671h, 06e6b06e7h
  121.          dd     0fed41b76h, 089d32be0h, 010da7a5ah, 067dd4acch
  122.          dd     0f9b9df6fh, 08ebeeff9h, 017b7be43h, 060b08ed5h
  123. ;            A
  124.          dd     0d6d6a3e8h, 0a1d1937eh, 038d8c2c4h, 04fdff252h
  125.          dd     0d1bb67f1h, 0a6bc5767h, 03fb506ddh, 048b2364bh
  126.          dd     0d80d2bdah, 0af0a1b4ch, 036034af6h, 041047a60h
  127.          dd     0df60efc3h, 0a867df55h, 0316e8eefh, 04669be79h
  128. ;            B
  129.          dd     0cb61b38ch, 0bc66831ah, 0256fd2a0h, 05268e236h
  130.          dd     0cc0c7795h, 0bb0b4703h, 0220216b9h, 05505262fh
  131.          dd     0c5ba3bbeh, 0b2bd0b28h, 02bb45a92h, 05cb36a04h
  132.          dd     0c2d7ffa7h, 0b5d0cf31h, 02cd99e8bh, 05bdeae1dh
  133. ;            C
  134.          dd     09b64c2b0h, 0ec63f226h, 0756aa39ch, 0026d930ah
  135.          dd     09c0906a9h, 0eb0e363fh, 072076785h, 005005713h
  136.          dd     095bf4a82h, 0e2b87a14h, 07bb12baeh, 00cb61b38h
  137.          dd     092d28e9bh, 0e5d5be0dh, 07cdcefb7h, 00bdbdf21h
  138. ;            D
  139.          dd     086d3d2d4h, 0f1d4e242h, 068ddb3f8h, 01fda836eh
  140.          dd     081be16cdh, 0f6b9265bh, 06fb077e1h, 018b74777h
  141.          dd     088085ae6h, 0ff0f6a70h, 066063bcah, 011010b5ch
  142.          dd     08f659effh, 0f862ae69h, 0616bffd3h, 0166ccf45h
  143. ;            E
  144.          dd     0a00ae278h, 0d70dd2eeh, 04e048354h, 03903b3c2h
  145.          dd     0a7672661h, 0d06016f7h, 04969474dh, 03e6e77dbh
  146.          dd     0aed16a4ah, 0d9d65adch, 040df0b66h, 037d83bf0h
  147.          dd     0a9bcae53h, 0debb9ec5h, 047b2cf7fh, 030b5ffe9h
  148. ;            F
  149.          dd     0bdbdf21ch, 0cabac28ah, 053b39330h, 024b4a3a6h
  150.          dd     0bad03605h, 0cdd70693h, 054de5729h, 023d967bfh
  151.          dd     0b3667a2eh, 0c4614ab8h, 05d681b02h, 02a6f2b94h
  152.          dd     0b40bbe37h, 0c30c8ea1h, 05a05df1bh, 02d02ef8dh
  153.  
  154.  
  155.          MODEL TPASCAL
  156.  
  157. PUBLIC   UpdateCRC32
  158. PROC     UpdateCRC32 FAR initcrc:DWORD,inbuf:DWORD,inlen:WORD
  159. ; UpdateCRC32 takes an initial CRC value and updates it with inlen bytes from
  160. ; inbuf. The updated CRC is returned in DX:AX.  The Pascal declaration is:
  161. ; Function UpdateCRC32(InitCRC : LongInt; Var InBuf; InLen : Word) : LongInt;
  162. ; Stomps registers: AX,BX,CX,DX,ES,SI
  163.          push   ds
  164.          lds    si,[inbuf]    ; ds:si := ^inbuf
  165.          les    ax,[initcrc]  ; dx:ax := initcrc
  166.          mov    dx,es
  167.          mov    cx,[inlen]    ; cx := inlen
  168.          or     cx,cx
  169.          jz     @@done
  170. @@loop:
  171.          xor    bh,bh
  172.          mov    bl,al
  173.          lodsb
  174.          xor    bl,al
  175.          mov    al,ah
  176.          mov    ah,dl
  177.          mov    dl,dh
  178.          xor    dh,dh
  179.          shl    bx,1
  180.          shl    bx,1
  181.          les    bx,[crc32tab+bx]
  182.          xor    ax,bx
  183.          mov    bx,es
  184.          xor    dx,bx
  185.          loop   @@loop
  186. @@done:
  187.          pop    ds
  188.          ret
  189. ENDP
  190.  
  191. ENDS
  192. END
  193.